/**
 * @param {number[]} nums
 * @return {number}
 */
var findMin = function (nums) {
  return Math.min([...nums])
};

/**
 * @param {number[]} nums
 * @return {number}
 */
var findMin = function (nums) {
  let minVal = nums[0]; // 初始化最小值为第一个元素
  for (let i = 1; i < nums.length; i++) {
    if (nums[i] < minVal) {
      minVal = nums[i]; // 遇到更小的元素则更新最小值
    }
  }
  return minVal;
};

/**
 * @param {number[]} nums
 * @return {number}
 */
/* 
为了在旋转排序数组中高效地找到最小值，可以使用二分查找的变体。
关键在于利用数组的有序部分来确定最小值可能存在的区间。

方法思路
二分查找初始化：设置左右指针分别指向数组的首尾。
判断有序部分：每次计算中间索引后，判断左半部分或右半部分是否有序。
确定最小值位置：
如果右半部分有序（中间元素小于右边界元素），说明最小值在左半部分或就是中间元素，收缩右指针。
如果左半部分有序（中间元素大于右边界元素），说明最小值在右半部分，收缩左指针。
终止条件：当左右指针相遇时，即为最小值的位置。
*/
var findMin = function (nums) {
  let left = 0;
  let right = nums.length - 1;

  while (left < right) {
    const mid = Math.floor((left + right) / 2);

    // 如果中间元素小于右边界元素，说明右半部分有序，最小值在左半部分
    if (nums[mid] < nums[right]) {
      right = mid;
    }
    // 否则，中间元素大于右边界元素，说明最小值在右半部分
    else {
      left = mid + 1;
    }
  }

  return nums[left];
};